From 9606c1eee9faaca7a7822ada3509b27fa98966e7 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 22 Apr 2020 20:25:48 +0100 Subject: [PATCH] Notify mapped state to the accessible object directly Do not use signal connections: if we have an accessible object, notify it directly when getting mapped and unmapped. --- gtk/a11y/gtkwidgetaccessible.c | 23 ++++++++++++++--------- gtk/a11y/gtkwidgetaccessibleprivate.h | 4 +++- gtk/gtkwidget.c | 10 ++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/gtk/a11y/gtkwidgetaccessible.c b/gtk/a11y/gtkwidgetaccessible.c index 9725d00f2e..ddd16a0cd6 100644 --- a/gtk/a11y/gtkwidgetaccessible.c +++ b/gtk/a11y/gtkwidgetaccessible.c @@ -76,16 +76,23 @@ gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self) g_signal_emit_by_name (self, "bounds-changed", &rect); } -/* Translate GtkWidget mapped state into AtkObject showing */ -static gint -map_cb (GtkWidget *widget) +/*< private > + * gtk_widget_accessible_notify_showing: + * @self: a #GtkWidgetAccessible + * + * Translates the #GtkWidget mapped state into the #AtkObject + * showing state. + */ +void +gtk_widget_accessible_notify_showing (GtkWidgetAccessible *self) { - AtkObject *accessible; + g_return_if_fail (GTK_IS_WIDGET_ACCESSIBLE (self)); + + GtkWidget *widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (self)); - accessible = gtk_widget_get_accessible (widget); - atk_object_notify_state_change (accessible, ATK_STATE_SHOWING, + atk_object_notify_state_change (ATK_OBJECT (self), + ATK_STATE_SHOWING, gtk_widget_get_mapped (widget)); - return 1; } static void @@ -97,8 +104,6 @@ gtk_widget_accessible_initialize (AtkObject *obj, widget = GTK_WIDGET (data); g_signal_connect (widget, "notify", G_CALLBACK (notify_cb), NULL); - g_signal_connect (widget, "map", G_CALLBACK (map_cb), NULL); - g_signal_connect (widget, "unmap", G_CALLBACK (map_cb), NULL); GTK_WIDGET_ACCESSIBLE (obj)->priv->layer = ATK_LAYER_WIDGET; obj->role = ATK_ROLE_UNKNOWN; diff --git a/gtk/a11y/gtkwidgetaccessibleprivate.h b/gtk/a11y/gtkwidgetaccessibleprivate.h index ac60f0e43d..e1f210bb35 100644 --- a/gtk/a11y/gtkwidgetaccessibleprivate.h +++ b/gtk/a11y/gtkwidgetaccessibleprivate.h @@ -25,7 +25,9 @@ G_BEGIN_DECLS void _gtk_widget_accessible_set_layer (GtkWidgetAccessible *accessible, AtkLayer layer); -void gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self); +void gtk_widget_accessible_update_bounds (GtkWidgetAccessible *self); + +void gtk_widget_accessible_notify_showing (GtkWidgetAccessible *self); G_END_DECLS diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 0b23197342..de02f2b3ae 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2754,11 +2754,16 @@ gtk_widget_map (GtkWidget *widget) if (!_gtk_widget_get_mapped (widget)) { + GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + gtk_widget_push_verify_invariants (widget); if (!_gtk_widget_get_realized (widget)) gtk_widget_realize (widget); + if (priv->accessible != NULL) + gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible)); + g_signal_emit (widget, widget_signals[MAP], 0); update_cursor_on_state_change (widget); @@ -2783,6 +2788,8 @@ gtk_widget_unmap (GtkWidget *widget) if (_gtk_widget_get_mapped (widget)) { + GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget); + g_object_ref (widget); gtk_widget_push_verify_invariants (widget); @@ -2791,6 +2798,9 @@ gtk_widget_unmap (GtkWidget *widget) g_signal_emit (widget, widget_signals[UNMAP], 0); + if (priv->accessible != NULL) + gtk_widget_accessible_notify_showing (GTK_WIDGET_ACCESSIBLE (priv->accessible)); + update_cursor_on_state_change (widget); gtk_widget_pop_verify_invariants (widget); -- 2.30.2